#include "USER_SPI.h"
#include "typedef.h"
#define SPI_MASTER_CASE 0
#define SPI_SLAVE_CASE 1

#define SPI_CASE_SELECT SPI_MASTER_CASE

struct bflb_device_s *spi0;

struct bflb_device_s *gpio_uspi;

// SPI轮询测试函数
int bflb_spi_poll_test(uint32_t data)
{
    // 设置数据宽度
    bflb_spi_feature_control(spi0, SPI_CMD_SET_DATA_WIDTH, SPI_DATA_WIDTH_8BIT);
    // 发送数据
    bflb_spi_poll_send(spi0, data);
    return 0;
}

/* main */
void Init_SPI(void)
{

    board_spi0_gpio_init();

    // /* spi cs */
    // bflb_gpio_init(gpio, GPIO_PIN_12, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
    // /* spi clk */
    // bflb_gpio_init(gpio, GPIO_PIN_13, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
    // /* spi miso */
    // bflb_gpio_init(gpio, GPIO_PIN_18, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);
    // /* spi mosi */
    // bflb_gpio_init(gpio, GPIO_PIN_19, GPIO_FUNC_SPI0 | GPIO_ALTERNATE | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_1);

    gpio_uspi = bflb_device_get_by_name("gpio");
    // res
    bflb_gpio_init(gpio_uspi, GPIO_PIN_26, GPIO_OUTPUT | GPIO_PULLUP);
    // dc
    bflb_gpio_init(gpio_uspi, GPIO_PIN_27, GPIO_OUTPUT | GPIO_PULLUP);
    // blk
    bflb_gpio_init(gpio_uspi, GPIO_PIN_28, GPIO_OUTPUT | GPIO_PULLUP);

    struct bflb_spi_config_s spi_cfg =
        {
            .freq = 50 * 1000 * 1000,
            .role = SPI_ROLE_MASTER,
            .mode = SPI_MODE3,
            .data_width = SPI_DATA_WIDTH_8BIT,
            .bit_order = SPI_BIT_MSB,
            .byte_order = SPI_BYTE_LSB,
            .tx_fifo_threshold = 0,
            .rx_fifo_threshold = 0,
        };

    spi0 = bflb_device_get_by_name("spi0");
    bflb_spi_init(spi0, &spi_cfg);

    bflb_spi_feature_control(spi0, SPI_CMD_SET_CS_INTERVAL, 0);
}

void LCD_CS_Clr()
{
    bflb_gpio_reset(gpio_uspi, CS_PIN);
}

void LCD_CS_Set()
{
    bflb_gpio_set(gpio_uspi, CS_PIN);
}

void LCD_DC_Clr()
{
    bflb_gpio_reset(gpio_uspi, DC_PIN);
}

void LCD_DC_Set()
{
    bflb_gpio_set(gpio_uspi, DC_PIN);
}

void LCD_RES_Clr()
{
    bflb_gpio_reset(gpio_uspi, RES_PIN);
}

void LCD_RES_Set()
{
    bflb_gpio_set(gpio_uspi, RES_PIN);
}

void LCD_BLK_Set()
{
    bflb_gpio_set(gpio_uspi, BLK_PIN);
}

void LCD_BLK_Clr()
{
    bflb_gpio_reset(gpio_uspi, BLK_PIN);
}